package modelo.bd.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import modelo.bd.ConexionPool;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Detalle;
import modelo.dominio.Evento;
import modelo.servicio.Causas;
import modelo.servicio.Pasos;
import modelo.servicio.Usuarios;

public class DetalleDAO {

    private String query;

    protected List<Detalle> select() throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        List<Detalle> resultados = null;
        try {
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            resultados = new ArrayList<Detalle>();
            while (resultado.next()) {
                Detalle detalle = new Detalle();
                detalle.setComentarios(resultado.getString("comentarios") != null
                        ? resultado.getString("comentarios") : "");
                detalle.setFechaEjecucion(resultado.getTimestamp("fecha_ejecu"));
                detalle.setIdentificador(resultado.getLong("identificador"));
                detalle.setCausa(Causas.instancia().porClave(resultado.getString("clave_clave")));
                Evento evento = new Evento();
                evento.setOrigen(Pasos.instancia().porClave(resultado.getString("clave_flujo"), resultado.getString("clave_paso")));
                evento.setClave(resultado.getString("clave"));
                evento.setDescripcionCorta(resultado.getString("descripcion_corta") == null
                        ? ""
                        : resultado.getString("descripcion_corta"));
                evento.setDescripcion(resultado.getString("descripcion"));
//                evento.setSiguiente(Pasos.instancia().porClave(resultado.getString("clave_flujo"), resultado.getString("sig_paso")));
//                if (!(resultado.getString("sig_paso_monto") == null || resultado.getString("sig_paso_monto").equals(""))) {
//                    evento.setSiguienteMonto(Pasos.instancia().porClave(resultado.getString("clave_flujo"), resultado.getString("sig_paso_monto")));
//                }
                evento.setTipoAprobacion(resultado.getString("tipo_aprobacion") == null
                        ? ""
                        : resultado.getString("tipo_aprobacion"));
                evento.setAprobadores(resultado.getInt("aprobadores"));

                evento.setCausable(resultado.getString("causable").equalsIgnoreCase("S"));
                evento.setTipoCausa(resultado.getString("tipo_causa") == null
                        ? ""
                        : resultado.getString("tipo_causa"));
                evento.setValidaForzosos(resultado.getString("forzosos").equalsIgnoreCase("S"));//
                detalle.setEvento(evento);
//                detalle.setSolicitud(Solicitudes.instancia().porClave(resultado.getString("flujo_clave"),
//                        resultado.getLong("folio")));
                detalle.setEjecutor(Usuarios.instancia().porClave(resultado.getString("ejecutor")));
                resultados.add(detalle);
            }
        } catch (SQLException ex) {
            throw new DAOException("Error DEDS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("Error DEDS-SQL " + ex.getMessage());
            }
        }
        return resultados;
    }

    public List<Detalle> selectAll() throws DAOException {
        query = "SELECT dehf_cafl_clave  AS clave_clave, \n"
                + "       dehf_fluj_clave  AS flujo_clave, \n"
                + "       dehf_pafl_clave  AS paso_clave, \n"
                + "       dehf_evfl_clave  AS evento_clave, \n"
                + "       dehf_hifl_numero AS folio, \n"
                + "       dehf_fecha       AS fecha_ejecu,\n"
                + "       dehf_comentarios AS comentarios,\n"
                + "       dehf_numero      AS identificador, \n"
                + "       dehf_uspe_clave  AS ejecutor \n"
                + "FROM   sil_detalle_historico_flujo ";
        return select();
    }

    public List<Detalle> selectWhere(String condition) throws DAOException {
        query = "SELECT dehf_cafl_clave  AS clave_clave, \n"
                + "       dehf_fluj_clave  AS flujo_clave, \n"
                + "       dehf_pafl_clave  AS paso_clave, \n"
                + "       dehf_evfl_clave  AS evento_clave, \n"
                + "       dehf_hifl_numero AS folio, \n"
                + "       dehf_fecha       AS fecha_ejecu,\n"
                + "       dehf_comentarios AS comentarios,\n"
                + "       dehf_numero      AS identificador,\n"
                + "       dehf_uspe_clave  AS ejecutor,\n"
                + "       evfl_fluj_clave     AS clave_flujo, \n"
                + "       evfl_pafl_origen    AS clave_paso, \n"
                + "       evfl_clave          AS clave, \n"
                + "       evfl_descripcion    AS descripcion, \n"
                + "       evfl_desc_corta     AS descripcion_corta, \n"
                + "       evfl_tipo_aprobacion    AS tipo_aprobacion, \n"
                + "       evfl_numero_aprobadores AS aprobadores, \n"
                + "       evfl_requiere_causa AS causable, \n"
                + "       evfl_tipo_causa     AS tipo_causa, \n"
                + "       evfl_valida_forzosos   AS forzosos, \n"
                + "       evfl_pafl_flujo     AS sig_paso, \n"
                + "       evfl_pafl_monto     AS sig_paso_monto \n"
                + "FROM   sil_detalle_historico_flujo, sil_eventos_flujo \n"
                + "WHERE  evfl_fluj_clave  = dehf_fluj_clave\n"
                + "AND    evfl_pafl_origen = dehf_pafl_clave\n"
                + "AND    evfl_clave       = dehf_evfl_clave " + condition
                + " ORDER BY dehf_fecha DESC";
        return select();
    }
}
